package multithreading;

/**
 * 多线程
 *
 * 对于java程序来说，当在DOS命令窗口中输入：
 * java HelloWorld 回车之后。会先启动JVM，而JVM就是一个进程。
 * JVM再启动一个主线程调用main方法（main方法就是主线程）。
 * 同时再启动一个垃圾回收线程负责看护，回收垃圾
 *
 * 线程A和线程B，堆内存和方法区内存共享。
 * 但是栈内存独立，一个线程一个栈，每个栈之间，互不干扰，各自执行各自的
 *
 * main方法结束只是主线程结束了，主栈空了，其它的栈(线程)可能还在压栈弹栈
 *
 * 常见的线程调度模型
 *     抢占式调度模型：
 *          那个线程的优先级比较高，抢到的CPU时间片的概率就高一些/多一些。
 *          java采用的就是抢占式调度模型。
 *
 *     均分式调度模型：
 *          平均分配CPU时间片。每个线程占有的CPU时间片时间长度一样。
 *          平均分配，一切平等。
 *          有一些编程语言，线程调度模型采用的是这种方式
 *
 * Java中有三大变量：
 *      实例变量：在堆中
 *      静态变量：在方法区
 *      局部变量：在栈中
 *
 * 局部变量永远都不会存在线程安全问题，因为局部变量不共享（一个线程一个栈）
 * 实例变量在堆中，堆只有1个
 * 静态变量在方法区中，方法区只有1个
 * 堆和方法区都是多线程共享的，所以可能存在线程安全问题
 *
 * 局部变量+常量：不会有线程安全问题
 * 成员变量（实例+静态）：可能会有线程安全问题
 *
 * java语言中线程分为两大类：
 *      一类是：用户线程
 *      一类是：守护线程（后台线程）
 *      其中具有代表性的就是：垃圾回收线程（守护线程）
 *      守护线程特点：一般守护线程是一个死循环，所有的用户线程只要结束，守护线程自动结束
 * 主线程main方法是一个用户线程
 *
 * 定时器：间隔特定的时间，执行特定的程序
 * 实现方式：
 *      可以使用sleep方法，睡眠，设置睡眠时间，没到这个时间点醒来，执行任务，（比较low）
 *
 *      在java的类库中已经写好了一个定时器：java.util.Timer，可以直接拿来用。
 *      不过，这种方式在目前的开发中也很少用，因为现在有很多高级框架都是支持定时任务的
 * */

public class Multithreading {

}
